<?
/***********************************************************/
/* Class defining the filetree box
/* by Pablo Dall'Oglio 2001-2006
/***********************************************************/
class RemoteTree extends GtkTreeView
{
    /***********************************************************/
    /* Constructor Method, cria a Arvore de Projetos ou Preferencias
    /* baseado na pagina 322 do livro
    /* Php-Gtk criando aplica�oes graficas com php
    /* autor Pablo Dall'Oglio
    /* Helder Mauricio Gomes Ferreira
    /*adaptando o tulip para Php-Gtk2 2008
    /*$array = matriz contendo o menu
    /***********************************************************/
    private $model;         //modelo de dados arvore
    private $callback;     //a��o ao selecionar arquivo
    
    
    /*
    *metodo construtor
    *Cria a arvore
    */
    
    function __construct()
    {   
    global $Pixmaps;
        // chama o metodo construtor da classe pai
        //mesmo que new "GtkTreeView"
        parent::__construct();
        
        //separador de arquivos � definido no arquivo chamador costante bar
        //cria o modelo de dados
        //Gtk::TYPE_OBJECT= para colocar o objeto tipo GdkPixbuf::new_from_file('icon/folder.pnp");
        //Gtk::TYPE_STRING= Para colocar o nome do arquivo 
        //Gtk::TYPE_STRING = para colocar o endere�o do arquivo
        //Gtk::TYPE_STRING  marcando como diretorio ja percorrido
       if (defined("GObject::TYPE_STRING")) {
            $this->model = new GtkTreeStore(GObject::TYPE_OBJECT,GObject::TYPE_STRING,GObject::TYPE_STRING,GObject::TYPE_STRING,GObject::TYPE_STRING);
        }
        if (defined("Gtk::TYPE_STRING")) {
            $this->model = new GtkTreeStore(Gtk::TYPE_OBJECT,Gtk::TYPE_STRING,Gtk::TYPE_STRING,Gtk::TYPE_STRING,Gtk::TYPE_STRING);
        }

        //DEFINE A A��O AO SER CLICADO NA ARVORE
        $this->connect('button-release-event', array(&$this, 'onAbrirPasta'));
        parent::set_model($this->model);
        //cria duas colunas
        
        $column1 = new GtkTreeViewColumn();        
        $column2 = new GtkTreeViewColumn();
        
        //cria os renderizadores para as colunas
        // for image
        $cell_renderer1 = new GtkCellRendererPixbuf();
        //for file
        $cell_renderer2 = new GtkCellRendererText();
        
        //adiciona renderizadores as colunas
        $column1->pack_start($cell_renderer1, false);
        $column1->pack_start($cell_renderer2, false);
        //define qual renderizador corresponde a qual coluna do modelo
         //adiciona renderizadores as colunas
        $column1->set_attributes($cell_renderer1, 'pixbuf',0);//troquei 'stock-id'
        $column1->set_attributes($cell_renderer2, 'text', 1);//troquei de 0 para 1
        
        //adicionando a coluna a arvore
        parent::append_column($column1);
        $column1->set_title('Servidor Remoto');
        
        //lendo figuras dos disco 
        $this->ico_home=GdkPixbuf::new_from_file($Pixmaps['home']);//rome
        $this->ico_dir=GdkPixbuf::new_from_file($Pixmaps['folder1']);//pasta
        $this->ico_file=GdkPixbuf::new_from_file($Pixmaps['doc']);//pasta aberta
        //este botao esta aqui para poder ser clicado
        //quando inicia ele e clicado pela TreeHandler.class
        //clicado ele abre as pastas na real ele le os projetos
        $this->BotaoOk = new GtkButton;
        
    }
    /*
    *Metodo onAbrirPasta
    *Executado sempre que um nodo � clicado
    */
    public function onAbrirPasta()
    {
        //obtem a sele��o da arvore
        $treeselection = parent::get_selection();
        list($model, $iter) = $treeselection->get_selected();
        // se h� sele��o ...
        if($iter)
        {
            //obtem o caminho  do nodo
            $caminho =$this->model->get_value($iter, 2);//caminho do diretorio ou arquivo
            echo"\n server caminho=$caminho";
            $server =$this->model->get_value($iter, 4);//endere�o do servidor
            echo"\n server =$server";
           // $caminho0 =$this->model->get_value($iter, 0);//pixmap
            //echo"\n server caminho0=$caminho0";
            //verificando se ja foi percorrido
            $opened=$this->model->get_value($iter, 3);
            //so expande a arvore se for falso
            
            if(!empty($opened)){ //se for vasio � arquivo
                echo "\n expandindo=$opened.."; 
                //so expande a arvore se for falso
                if($this->model->get_value($iter, 3)=='false'){
                //setando para n�o expandir mais
                $this->model->set($iter, 3 , 'true');
                $this->abreDiretorio($server,$caminho,$iter);//$Arquivo, '.', $selecao
                }
            }else{ 
                echo "\n abrindo como arquivo =$opened.."; 
                //executa a fun��o programada pelo usuario
                //usuario , passando o caminho do arquivo
                
                if($this->callback){
                    echo "\n abrirpasta callbak $this->callback";
                    call_user_func($this->callback,$server,$caminho);
                }
            }
        }
    }
    /*
    *metodo abreDiretorio
    *L� o conteudo de um diretorio e mostra na arvore de arquivos
    */
    function abreDiretorio($Server,$caminho,$iter)
    {   
        if (!$Server)
        {
            return false;
        }
        # Define um array de parametros
        $param = array('Directory'=>$caminho);
        $parametro=$param['Directory'];
        echo "\n parametro =$parametro";
        # Cria objeto cliente SOAP
        echo"\n criando o objeto soap";
        $client = new soap_client("http://$Server/phpgtkeditor-server.php");
        
        $filelist= $client->call('dir_list',$param);
        if ($filelist == 'denied')
        {
            new Dialog(_a('Permission denied'));
            return false;
        }
        if ($filelist)
        {   //ordena a lista
            sort($filelist);
            //percorre a lista
            foreach ($filelist as $arquivo)
            {
                $old = $arquivo;
                $arquivo = trim($arquivo);
                $localizacao = "$caminho" . bar . "$arquivo";
                if ($arquivo == '.' || $arquivo == '..')
                    continue;
                
                if (substr($old,0,1) == ' ')
                {
                    
                if($caminho=='.')
                    {
                    $localizacao =$arquivo;
                    }
                    else{
                        $localizacao = $caminho . bar .$arquivo;
                        }
                 
                //adiciona a linha na arvore contendo pasta
                $nodes[$localizacao] = $this->model->append($iter);
                $this->model->set($nodes[$localizacao], 0 , $this->ico_dir);//figura ?
                $this->model->set($nodes[$localizacao], 1 , $arquivo);//nome
                $this->model->set($nodes[$localizacao], 2 , $localizacao);//endere�o
                $this->model->set($nodes[$localizacao], 3 , 'false');//false se ainda n�o explorado
                $this->model->set($nodes[$localizacao], 4 , $Server);//endere�o onde esta o arquivo servidor
                $this->expand_all();
            
                }
                else
                {
                   
                    if($caminho=='.')
                    {
                    $localizacao =$arquivo;
                    }
                    else{
                        $localizacao = $caminho . bar .$arquivo;
                        }
                                     
                    //adiciona a linha na arvore contendo arquivo
                    $nodes[$localizacao] = $this->model->append($iter);
                    $this->model->set($nodes[$localizacao], 0 , $this->ico_file);//figura ?
                    $this->model->set($nodes[$localizacao], 1 , $arquivo);//nome
                    $this->model->set($nodes[$localizacao], 2 , $localizacao);//endere�o
                    $this->model->set($nodes[$localizacao], 3 , '');//false se ainda n�o explorado
                    $this->model->set($nodes[$localizacao], 4 , $Server);//endere�o onde esta o arquivo servidor
                }
            }
        }
        else
        {
            new Dialog(_a('Connection Problems'));
            return false;
        }
        //parent::thaw();
        return ;//true;
    }
    
    /*
    *metodo setCallBack
    *Define a a��o ao selecionar arquivo
    *ou seja, a fun��o a ser executada
    */
    function setCallBack($callback)
    {
        $this->callback = $callback;
       
    }
    //fun�oes originais tentando adapitar
    //funcao usada para listar os projetos
    /***********************************************************/
    /* Reloads the tree
    /***********************************************************/
    function ReadAgain()
    {
        $this->opened = null;
        $this->model->clear();
        $entries = $this->entries;
        $this->entries = null;
        
        if ($entries)
        {
            foreach($entries as $entry)
            {
                
                $this->AddHome($entry, null);
            }
        }
        
    }

    /***********************************************************/
    /* Clear all the contents
    /***********************************************************/
    function MyClear()
    {
        
       $this->model->clear();
    }
    /***********************************************************/
    /* AddHome
    /***********************************************************/
                    //$Home, $address
    function AddHome($nome= 'Home',$folder,$pixmap = null){
    $root = $folder;            //recbo /home/helder/B2Stok um diretorio
    $dir_list = array($root);   //$dir_list[0='/home/helder/B2Stok';
    $nodes = array();           // $nodes[0]='';
    $pix_home=$this->ico_home;//=GdkPixbuf::new_from_file($Pixmaps['home']);
    if(!empty($pixmap)){
        if(is_file($pixmap)){
    $pix_home=GdkPixbuf::new_from_file($pixmap);
    }
    }
    $nodes[$root] = null;       // $nodes[/home/helder/B2Stok] = '';
    $nodes[$root] = $this->model->append();
                $this->model->set($nodes[$root], 0 , $pix_home);//'gtk-directory');//figura ?
                $this->model->set($nodes[$root], 1 , $nome);//nome
                $this->model->set($nodes[$root], 2 , '.');//endere�o inicial deve ser um ponto
                $this->model->set($nodes[$root], 3 , 'false');
                $this->model->set($nodes[$root], 4 , $root);//endere�o do servidor � repetido em todos os nos
    $this->expand_all();
    //$this->callback=array(this,onAbrirPasta);
    }
    
function on_selection_changed($button) {
    $folder = $button->get_current_folder();
    echo "new folder: $folder\n";
    populate_tree($folder);
}
}
?>